package com.brillilab.service.core.method;

import java.util.List;

import com.brillilab.domain.enums.method.MethodTypeLevelEnum;
import com.brillilab.domain.po.method.MethodType;
import com.brillilab.domain.vo.method.MethodTypeDetailVo;
import com.brillilab.domain.vo.method.RecommendMethodTypeVo;
import com.brillilab.domain.vo.method.ReferExportCountVo;

public interface IMethodTypeService {
    /*********************************wuzhiyu**************************************/
    /**
     * @return com.brillilab.domain.po.method.MethodType
     * @Description: 获取方法类型
     * @Params: [typeId]
     * @author wuzhiyu
     * @date 2019/2/25 10:04
     */
    MethodType getMethodTypeById(Long typeId);

    /**
     * @return java.lang.String
     * @Description: 根据第三级类型id获取方法类型路径
     * @Params: [thirdTypeId]
     * @author wuzhiyu
     * @date 2019/2/25 10:04
     */
    MethodTypeDetailVo getMethodFullNameByThirdId(Long thirdTypeId);

    /**
     * 根据用户ID获取三级方法类型
     *
     * @param userId
     * @return
     */
    List<MethodType> getThirdTypeList(Long labId, Long userId, int isOwn);

    /**
     * @return java.util.List<com.brillilab.domain.po.method.MethodType>
     * @Description: 获取公共方法类型
     * @Params: []
     * @author wuzhiyu
     * @date 2019/2/25 10:05
     */
    List<MethodType> listPublicMethodType();

    /**
     * @return java.util.List<com.brillilab.domain.po.method.MethodType>
     * @Description: 根据第三级类型名和用户id获取所有第三级类型
     * @Params: [methodTypeName, userId]
     * @author wuzhiyu
     * @date 2019/2/25 10:05
     */
    List<MethodType> listByNameAndUserId(String methodTypeName, Long userId);

    /**
     * @return java.util.List<com.brillilab.domain.po.method.MethodType>
     * @Description: 根据第三季类型id获取此类型的三级类型
     * @Params: [thirdTypeId]
     * @author wuzhiyu
     * @date 2019/2/25 10:07
     */
    List<MethodType> listThreeLevelTypeByThirdId(Long thirdTypeId);

    /**
     * @return java.util.List<com.brillilab.domain.po.method.MethodType>
     * @Description: 获取用户所有的方法类型
     * @Params: [userId]
     * @author wuzhiyu
     * @date 2019/2/25 10:48
     */
    List<MethodType> listUserAllType(Long userId);

    /**
     * @return boolean
     * @Description: 新增方法类型
     * @Params: [methodType]
     * @author wuzhiyu
     * @date 2019/2/25 13:07
     */
    boolean add(MethodType methodType);

    boolean updateById(MethodType method);
    List<MethodType> listByIdList(List<Long> typeIdList);

    List<MethodType> listRecommendMethodType(Long labId, MethodTypeLevelEnum typeLevel);
    /*********************************吴梦昊*******************************************/

    MethodType selectOneById(Long typeId);

    boolean delete(MethodType methodType);

    /**
     * 查找二级类型对应的三级类型
     * @param id
     * @return
     */
    List<MethodType> selectThirdListBySecondId(Long id,Long userId);

    /**
     * 查找一级类型对应的二级类型
     * @return
     */
    List<MethodType> selectSecondListByFirstId(Long firstId,Long userId);

    /**
     * 批量查找二级类型对应的三级类型
     * @param secondIds
     * @return
     */
    List<MethodType> selectThirdListBySecondIdList(List<Long> secondIds,Long userId);

    /**
     * 查询各级类型列表
     *    示例：
     *    selectListByLevelAndParentIdAndUserId(MethodTypeLevelEnum.LevelFirst.getLevel(),null,userId);
     *    查询属于userId的所有一级类型包括公共
     *    selectListByLevelAndParentIdAndUserId(MethodTypeLevelEnum.LevelSecond.getLevel(),null,userId);
     *    查询属于userId的所有二级类型包括公共
     *    selectListByLevelAndParentIdAndUserId(MethodTypeLevelEnum.LevelThird.getLevel(),parentId,userId);
     *    查询属于userId的二级类型id为parentId的三级类型包括公共
     *
     * @param level
     * @param parentId
     * @param userId
     * @return
     */
    List<MethodType> selectListByLevelAndParentIdAndUserId(Integer level,Long parentId,Long userId);

    /**
     * 批量更新
     * @param thirdTypes
     * @return
     */
    boolean updateBatch(List<MethodType> thirdTypes);

    List<RecommendMethodTypeVo> selectRecommendThirdMethodVo(Long userId);

    List<MethodType> selectAllFirstMethodType();

    List<MethodType> selectReferenceMethodType();

    MethodType selectSecondType(String name,Long firstId,Long userId);

    MethodType selectThirdType(String name,Long secondId,Long userId);

    List<MethodType> getPublicThirdTypeList();

    List<MethodType> selectList(Long parentId,Integer level,String name,Long userId,boolean includeHide);

    List<MethodType> getUserAllThirdTypeList(Long userId);

    List<MethodType> selectList(Long userId,boolean includeHide);

    List<String> selectAllThirdMethodPrefix(Long secondTypeId,Long userId);

    int deleteByMethodTypeIds(List<Long> methodTypeIds,Long userId);

    int selectCount(Long parentId,Integer level,String name,Long userId);

    List<MethodType> selectFreqUseThirdMethod(Long userId);

    List<MethodType> selectTopFreqUseThirdMethod(Long userId);
}
